//
//  YBAuthApi.m
//  YBWifiAuthSDK
//
//  Created by yiban on 16/1/21.
//  Copyright © 2016年 yiban. All rights reserved.
//

#import "YBAuthApi.h"
#import "YBDevice.h"
#import "YBHTTPClient.h"
#define BASE_URL @"http://10.21.3.59:8888/api/"
//#define BASE_URL @"https://mobile.yiban.cn/api/"
@interface YBAuthApi()
@property(nonatomic,strong)NSString *deviceToken;
@end

@implementation YBAuthApi
@synthesize deviceToken=_deviceToken;
@synthesize access_token=_access_token;

+ (instancetype)sharedYBAuthApi
{
    static YBAuthApi *instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[YBAuthApi alloc] init];
    });
    return instance;
}

- (id)init {
    self = [super init];
    if (self) {
        _deviceToken =@"";
    }
    return self;
}
-(void)dealloc
{
    self.deviceToken = nil;
    self.access_token=nil;
}

- (void)setDeviceToken:(NSString *)deviceToken
{
    _deviceToken =deviceToken;
}
- (void)setAccess_token:(NSString *)access_token
{
    //将上述数据全部存储到NSUserDefaults中
    NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];
    //存储时，除NSNumber类型使用对应的类型意外，其他的都是使用setObject:forKey:
    [userDefaults setValue:access_token forKey:@"yb_access_token"];
    //这里建议同步存储到磁盘中，但是不是必须的
    [userDefaults synchronize];
}
-(NSString*)access_token
{
    _access_token =[[NSUserDefaults standardUserDefaults] objectForKey:@"yb_access_token"];
    return _access_token;
}
//公共参数
/*
 apn	 客户端网络接入点 选填
 token  手机的  token  选填
 device  移动设备型号  选填
 sversion 移动设备系统版本号  选填
 latitude  经度  选填
 longitude  维度   选填
 address: 地理位置 选填
 authCode: 第三方绑定authcode 选填
 */
-(NSMutableDictionary *)commonParams
{
    NSMutableDictionary *common =[NSMutableDictionary dictionary];
    [common setValue:[YBDevice appVersion] forKey:@"v"];
    [common setValue:[YBDevice networkType] forKey:@"apn"];
    [common setValue:[YBDevice deviceModel] forKey:@"device"];
    [common setValue:[NSString stringWithFormat:@"%f",[YBDevice sysVersion]] forKey:@"sversion"];
    [common setValue:[YBAuthApi sharedYBAuthApi].deviceToken forKey:@"token"];
    [common setValue:@"" forKey:@"latitude"];
    [common setValue:@"" forKey:@"longitude"];
    [common setValue:@"" forKey:@"address"];
    [common setValue:@"" forKey:@"authCode"];
    
    return common;
}


/*
 客户端登录接口: v2/passport/login
 account : 手机号/邮箱/用户名/易班ID    必填
 passwd:  密码  必填
 ct	 客户端类型：1: ios，2: android 3 pc客户端app 4 web  必填
 app:   调用的app类型  1 主社区app 2 资料库app 3 笔记app 4 pc客户端app 5 虚拟磁盘 app 必填
 v	 客户端版本号  必填
 
 identify	 手机imei号  web 选填  ios , android 必填
 
 */
- (void)loginWithParamter:(NSDictionary*)params completion:(YBAuthApiCompletionHandler)completionBlock
{
    if (params==nil||[params allKeys].count<=0) {
        completionBlock(nil,nil);
        return;
    }
    NSString *account = [params objectForKey:@"account"];
    NSString *passwd = [params objectForKey:@"passwd"];
    if (account.length>0 && passwd.length>0)
    {
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        [dict setValue:account forKey:@"account"];
        [dict setValue:passwd forKey:@"passwd"];
        [dict setValue:@"1" forKey:@"ct"];
        [dict setValue:@"1" forKey:@"app"];
        NSString *uuid = [YBDevice getUUIDString];
        NSString *identify;
        if (uuid && uuid.length != 0) {
            identify = uuid;
        } else {
            identify = [YBDevice getSigTime];
        }
        [dict setValue:identify forKey:@"identify"];
        //    [dict setValue:SHARED.token forKey:@"token"];
        [dict setValue:[YBDevice getSigTime] forKey:@"sig"];
        
        NSMutableDictionary *paramters = [NSMutableDictionary dictionaryWithDictionary:dict];
        [paramters addEntriesFromDictionary:[self commonParams]];
        NSString *urlstr =[NSString stringWithFormat:@"%@%@",BASE_URL,@"v2/passport/login"];
        __weak typeof (self) wSelf = self;
        [[YBHTTPClient sharedClient] GET:urlstr parameters:paramters completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {
            if (response && [response isKindOfClass:[NSDictionary class]]) {
                NSDictionary *dict = (NSDictionary*)response;
                if (dict && [dict allKeys]>0 && [[dict allKeys] containsObject:@"data"]) {
                     NSDictionary *data = [dict objectForKey:@"data"];
                     NSString *access_token = [data objectForKey:@"access_token"];
                    [wSelf setAccess_token:access_token];
                }
               
            }
            completionBlock(response,error);
        }];
        
    }else{
        completionBlock(nil,nil);
        return;
    }
    
}
//退出登录
- (void)logout
{
    if (self.access_token==nil || self.access_token.length==0) {
        return;
    }
    NSMutableDictionary *dict = [NSMutableDictionary dictionary];
    [dict setValue:self.access_token forKey:@"access_token"];
    NSMutableDictionary *paramters = [NSMutableDictionary dictionaryWithDictionary:dict];
    [paramters addEntriesFromDictionary:[self commonParams]];
    NSString *urlstr =[NSString stringWithFormat:@"%@%@",BASE_URL,@"v1/passport/logout"];
    __weak typeof (self) wSelf = self;
    [[YBHTTPClient sharedClient] GET:urlstr parameters:paramters completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {
         [wSelf setAccess_token:nil];
    }];
  
}
//是否登录
- (BOOL)isLogin
{
    if (self.access_token && self.access_token.length>0) {
        return YES;
    }
    return NO;
}

/*
 *手机号识别登录状态接口
 *名称 v1/passport/checkphone
 *请求 GET  http://{server_url}/v1/passport/checkphone
 *参数说明
      phone : 手机号码  必填
 *返回数据 API返回格式为JSON，返回JSON数组时以”[]“标出。
     ["response":"100","message":"请求成功","data":{"status":"1","users":[user]}]
 * data数据说明
     status ： 用户类型     1 手机绑定的老用户 2 未手机绑定的老用户或手机注册 3 可直接登录用户
     users：关联老账户数组， user具体字段如下
     id :用户id
     email:邮箱
     username：用户名
 */
- (void)checkPhoneNumberWithParamter:(NSDictionary*)params completion:(YBAuthApiCompletionHandler)completionBlock
{
    if (params==nil||[params allKeys].count<=0) {
        completionBlock(nil,nil);
        return;
    }
    NSString *phone = [params objectForKey:@"phone"];
    if (phone.length>0)
    {
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        [dict setValue:phone forKey:@"phone"];
        NSMutableDictionary *paramters = [NSMutableDictionary dictionaryWithDictionary:dict];
        [paramters addEntriesFromDictionary:[self commonParams]];
        NSString *urlstr =[NSString stringWithFormat:@"%@%@",BASE_URL,@"v1/passport/checkphone"];
        [[YBHTTPClient sharedClient] GET:urlstr parameters:paramters completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {
            completionBlock(response,error);
        }];
        
    }else{
        completionBlock(nil,nil);
        return;
    }
    
}
/*
 获取手机验证码接口
 
 *名称 v1/passport/authcode
 *请求 GET  http://{server_url}/v1/passport/authcode
 *参数说明
 phone : 手机号码  必填
 kind: 验证码类型 1 => 注册, 2 => 修改密码, 3 => 找回密码 ,4=>手机绑定 ，5=>登录设备绑定 必填
 *返回数据 API返回格式为JSON，返回JSON数组时以”[]“标出。
 ["response":"100","message":"请求成功","data":{"status":"1"}]
 * data数据说明
 status ： 是否成功发送验证码，0否1是
 */
- (void)getPhoneAuthCodeWithParamter:(NSDictionary*)params completion:(YBAuthApiCompletionHandler)completionBlock
{
    if (params==nil||[params allKeys].count<=0) {
        completionBlock(nil,nil);
        return;
    }
    NSString *phone = [params objectForKey:@"phone"];
    NSString *kind = [params objectForKey:@"kind"];
    if (phone.length>0 && kind.length>0)
    {
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        [dict setValue:phone forKey:@"phone"];
        [dict setValue:kind forKey:@"kind"];
        
        NSMutableDictionary *paramters = [NSMutableDictionary dictionaryWithDictionary:dict];
        [paramters addEntriesFromDictionary:[self commonParams]];
        NSString *urlstr =[NSString stringWithFormat:@"%@%@",BASE_URL,@"v1/passport/authcode"];
        [[YBHTTPClient sharedClient] GET:urlstr parameters:paramters completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {
            completionBlock(response,error);
        }];
        
    }else{
        completionBlock(nil,nil);
        return;
    }
}

/*
 验证用户验证码接口
 
 *名称 v1/passport/checkcode
 *请求 GET  http://{server_url}/v1/passport/checkcode
 *参数说明
 account : 手机号码或者邮箱  必填
 code:  手机验证码 必填
 kind: 类型 1 注册，2 更换手机号，3 忘记密码，4 安全登录 选填
 *返回数据 API返回格式为JSON，返回JSON数组时以”[]“标出。
 ["response":"100","message":"请求成功","data":{"status":"1"}]
 * data数据说明
 status ： 是否验证成功，0否1是
 */
- (void)checkCodeWithParamter:(NSDictionary*)params completion:(YBAuthApiCompletionHandler)completionBlock
{
    if (params==nil||[params allKeys].count<=0) {
        completionBlock(nil,nil);
        return;
    }
    NSString *account = [params objectForKey:@"account"];
    NSString *code = [params objectForKey:@"code"];
    NSString *kind = [params objectForKey:@"kind"];
    if (account.length>0 && code.length>0)
    {
        NSMutableDictionary *dict = [NSMutableDictionary dictionary];
        [dict setValue:account forKey:@"account"];
        [dict setValue:code forKey:@"code"];
        [dict setValue:kind forKey:@"kind"];
        
        NSMutableDictionary *paramters = [NSMutableDictionary dictionaryWithDictionary:dict];
        [paramters addEntriesFromDictionary:[self commonParams]];
        NSString *urlstr =[NSString stringWithFormat:@"%@%@",BASE_URL,@"v1/passport/checkcode"];
        [[YBHTTPClient sharedClient] GET:urlstr parameters:paramters completion:^(id response, NSHTTPURLResponse *urlResponse, NSError *error) {
            completionBlock(response,error);
        }];
        
    }else{
        completionBlock(nil,nil);
        return;
    }
}

/*
 用户手机绑定接口
 *名称 v2/passport/bindphone
 *请求 CET  http://{server_url}/v2/passport/bindphone
 请求实例：
 
 GET  http://{server_url}/v2/passport/bindphone?access_token={access_token}&phone={phone}&code={code}
 请在"{ }"填入具体值，注意：这里举例采用的是BearerToken的Query请求方式，只是为了说明上更简单直观，不推荐这种方式, server_url 具体的api域名
 *参数说明
 access_token : 登录返回的access_token 必填
 phone: 绑定手机 必填
 code: 手机绑定验证码 必填
 *返回数据 API返回格式为JSON，返回JSON数组时以”[]“标出。
 ["response":"100","message":"请求成功","data":{"status":"1"}
 * data数据说明
 status: 是否绑定手机成功 1 是 0 否
 */

/*
 检查昵称是否合法接口
 
 *名称 v2/passport/checknick
 *请求 GET  https://{server_url}/v2/passport/checknick
 请求实例：
 
 GET  https://{server_url}/v2/passport/checknick?nick={nick}
 请在"{ }"填入具体值，注意：这里举例采用的是BearerToken的Query请求方式，只是为了说明上更简单直观，不推荐这种方式, server_url 具体的api域名
 *参数说明
 nick:昵称 必填
 *返回数据 API返回格式为JSON，返回JSON数组时以”[]“标出。
 ["response":"100","message":"请求成功","data":{"status":"1"}]
 * data数据说明
 status： 昵称是否合法 1 是 0 否
 */

/*
 修改登录设备号接口
 
 *名称 v2/passport/modefiydevice
 *请求 GET  https://{server_url}/v2/passport/modefiydevice
 请求实例：
 GET  https://{server_url}/v2/passport/modefiydevice?access_token={access_token}&identify={identify}
 请在"{ }"填入具体值，注意：这里举例采用的是BearerToken的Query请求方式，只是为了说明上更简单直观，不推荐这种方式, server_url 具体的api域名
 *参数说明
 access_token:登录成功返回access_token 必填
 identify： 机器设备号  必填
 *返回数据 API返回格式为JSON，返回JSON数组时以”[]“标出。
 ["response":"100","message":"请求成功","data":{"status":"1"}]
 * data数据说明
 status： 更换设备号成功标示  1 是 0 否
 */

/*
 获取校方认证信息接口
 
 *名称 v2/passport/studentinfo
 *请求 GET  https://{server_url}/v2/passport/studentinfo
 请求实例：
 GET  https://{server_url}/v2/passport/studentinfo?access_token={access_token}
 请在"{ }"填入具体值，注意：这里举例采用的是BearerToken的Query请求方式，只是为了说明上更简单直观，不推荐这种方式, server_url 具体的api域名
 *参数说明
 access_token:登录成功返回access_token 必填
 *返回数据 API返回格式为JSON，返回JSON数组时以”[]“标出。
 {
 
 "response": "100",
 "message": "请求成功",
 "data": {
 "schoolOrganization": {
 "user_id": "5000010",
 "publicName": "",
 "brief": "",
 "isAdministrative": "1",
 "isOrganization": "1",
 "school_id": "101",
 "pic_s": "http://10.21.3.85:803/5000010/avatar/user/68",
 "pic_b": "http://10.21.3.85:803/5000010/avatar/user/160",
 "background": {
 "b": "http://10.21.3.85:801/mobile/4IW7",
 "o": "http://10.21.3.85:801/mobile/4IW5",
 "m": "http://10.21.3.85:801/mobile/4IW6"
 }
 }
 }
 }
 
 * data数据说明
 schoolOrganization: 校方认证用户认证学校行政类机构号信息
 user_id: 机构号id
 publicName: 机构号名称
 brief: 机构号简介
 isAdministrative: 是否是行政类
 school_id: 学校id
 pic_s： 头像小图
 pic_b: 头像大图
 background: 背景图
 */

/*
 用户快速注册接口
 
 *名称v2/passport/register
 *请求POST  http://{server_url}/v2/passport/register
 请求实例：
 POST  http://{server_url}/v2/passport/register?phone={phone}&code={code}&passwd={passwd}
 请在"{ }"填入具体值，注意：这里举例采用的是BearerToken的Query请求方式，只是为了说明上更简单直观，不推荐这种方式, server_url 具体的api域名
 *参数说明
 code:手机验证码 必填
 phone : 手机号码 必填
 passwd:  密码 必填
 authCode: 第三方绑定authcode 选填
 *返回数据 API返回格式为JSON，返回JSON数组时以”[]“标出。
 ["response":"100","message":"请求成功","data":{'status' : 1,"useri_id":"1"}]
 * data数据说明
 staus: 注册成功标示 1成功 0 失败
 user_id ： 用户id
 */

/*
 用户完善注册信息接口
 
 *名称 v2/passport/registerinfo
 *请求 POST  http://{server_url}/v2/passport/registerinfo
 请求实例：
 POST  http://{server_url}/v2/passport/registerinfo?&nick={nick}&school_id={school_id}&college_id={college_id}&join_year={join_year}
 请在"{ }"填入具体值，注意：这里举例采用的是BearerToken的Query请求方式，只是为了说明上更简单直观，不推荐这种方式, server_url 具体的api域名
 *参数说明
 nick: 昵称 必填
 school_id:学校ID 必填
 join_year: 入学年份 必填
 college_id:学院ID  必填
 *返回数据 API返回格式为JSON，返回JSON数组时以”[]“标出。
 
 {
 
 "response": "100",
 "message": "请求成功",
 "data": {
 "friends": [
 {
 "user_id": "5000011",
 "nick": "上海海洋大学",
 "name": "",
 "isPublic": "1",
 "isOrganization": "1",
 "pic_s": "http://10.21.3.85:803/5000011/avatar/user/68",
 "pic_b": "http://10.21.3.85:803/5000011/avatar/user/68"
 }
 ],
 "groups": [
 {
 "id": "121917",
 "brief": "",
 "name": "通信学院",
 "user_id": "5000011",
 "auth": "1",
 "kind": "1",
 "img": "http://10.21.3.85:803/121917/avatar/group/88"
 }
 ]
 }
 } * data数据说明
 
 friends ：关注的机构号
 groups：加入的机构群
 ResponseCode 描述
 */


/*
 获取用户学校证信息接口
 
 *名称v2/passport/schoolinfo
 *请求GET  https://{server_url}/v2/passport/schoolinfo
 请求实例：
 
 GET  https://{server_url}/v2/passport/schoolinfo?access_token={access_token}
 请在"{ }"填入具体值，注意：这里举例采用的是BearerToken的Query请求方式，只是为了说明上更简单直观，不推荐这种方式, server_url 具体的api域名
 *参数说明
 access_token:登录成功返回access_token 必填
 *返回数据 API返回格式为JSON，返回JSON数组时以”[]“标出。
 
 {
 
 "response": "100",
 "message": "请求成功",
 "data": {
 "user_id": "602076",
 "school_id": "102",
 "school_name": "上海海洋大学",
 "provinceId": "207",
 "joinSchoolDate": "2011",
 "isNew": "0",
 "isSchoolVerify": "0",
 "schoolOrganization": {
 "user_id": "5000011",
 "publicName": "",
 "brief": "",
 "isAdministrative": "1",
 "school_id": "102",
 "pic_s": "http://10.21.3.85:803/5000011/avatar/user/68",
 "pic_b": "http://10.21.3.85:803/5000011/avatar/user/160"
 }
 }
 }
 
 * data数据说明
 user_id: 用户id
 school_id: 学校id
 school_name: 学校名称
 provinceId: 学校省份id
 joinSchoolDate: 入学年份
 isNew: 是否是新生  1 是 0 否
 isSchoolVerify:是否校方认证 1 是 0 否
 schoolOrganization: 校方认证用户认证学校行政类机构号信息
 user_id: 机构号id
 publicName: 机构号名称
 brief: 机构号简介
 isAdministrative: 是否是行政类
 school_id: 学校id
 pic_s： 头像小图
 pic_b: 头像大图
 background: 背景图
 ResponseCode 描述
 */


 /*
 uis登录是否显示
  
 *名称v2/passport/schoolinfo
 *请求GET  https://{server_url}/v2/passport/uisswitch
 请求实例：
 
 GET  https://{server_url}/v2/passport/uisswitch
 请在"{ }"填入具体值，注意：这里举例采用的是BearerToken的Query请求方式，只是为了说明上更简单直观，不推荐这种方式, server_url 具体的api域名
 *参数说明
 *返回数据 API返回格式为JSON，返回JSON数组时以”[]“标出。
 {
 "response": "100",
 "message": "请求成功",
 "data": {
 "status": "1" //0 不显示 1显示
 }
 }
 */
@end
